#include "ObjetoDinamico.h"
#include "../Estaticos/ObjetoEstatico.h"
#include "../../Escenario.h"
#include <cmath>
#include <iostream>
#define GRAVEDAD 4
ObjetoDinamico::ObjetoDinamico(short vida, Velocidad * velocidad, Figura* figura) : Objeto(vida,figura)
{
	this->velocidad = velocidad;
	tiempo = 0;
}

ObjetoDinamico::~ObjetoDinamico(void)
{
	delete(velocidad);
}

void ObjetoDinamico::vivir() {
	mover();
	this->getEscenario()->detectarImpacto(this);
}

short ObjetoDinamico::getVelocidadInstX() {
	return velocidad->getX();
}
short ObjetoDinamico::getVelocidadInstY() {
	return (velocidad->getY() - (GRAVEDAD * tiempo));
}
	

bool ObjetoDinamico::colisionaCon(Objeto *objeto){
	return objeto->colisionaCon(this);
}
bool ObjetoDinamico::colisionaCon(ObjetoEstatico *objeto) {
	this->colisionarCon(objeto);
	objeto->daniar(this->getVida());
	if (this->getVida() > 20){
	this->daniar(this->getVida()/2);
	}
	else{
	this->daniar(20);
	}
	return true; 
}
bool ObjetoDinamico::colisionaCon(ObjetoDinamico *objeto){
	this->colisionarCon(objeto);
	objeto->daniar(this->getVida()/2);
	if (this->getVida() > 20){
		this->daniar(this->getVida()/2);
	}
	else{
		this->daniar(20);
	}
	return true; 
}

void ObjetoDinamico::mover() {
	short x = this->getFigura()->getX0() + (velocidad->getX()) * this->tiempo;
	short y = (this->getFigura()->getY0() + ((velocidad->getY()) * this->tiempo)) - ((GRAVEDAD/2) * this->tiempo * this->tiempo);
	this->getFigura()->moverA(x,y);
	this->tiempo +=0.1;
}

void ObjetoDinamico::colisionarCon(ObjetoDinamico *otro) {
	float sParMod = this->figura->distanciaEntrePuntos(otro->figura->getX(),otro->figura->getY(),this->figura->getX(),this->figura->getY());
	
	float cosTh = (otro->figura->getX() - this->figura->getX()) / sParMod;
	float senTh = (otro->figura->getY() - this->figura->getY()) / sParMod;
	
	short vc1par = (otro->getVelocidadInstX() * cosTh)+(otro->getVelocidadInstY() * senTh);
	short vc1ort = (this->getVelocidadInstY() * cosTh)-(this->getVelocidadInstX() * senTh);
	
	short vc2par = (this->getVelocidadInstX() * cosTh)+(this->getVelocidadInstY() * senTh);
	short vc2ort = (otro->getVelocidadInstY() * cosTh)-(otro->getVelocidadInstX() * senTh);
	
	short v1fx = (vc1par*cosTh) - (vc1ort*senTh);
	short v1fy = (vc1par*senTh) + (vc1ort*cosTh);
	
	short v2fx = (vc2par*cosTh) - (vc2ort*senTh);
	short v2fy = (vc2par*senTh) + (vc2ort*cosTh);
	
	
	delete(this->velocidad);
	this->velocidad = new Velocidad(v1fx,v1fy);
	//Corre la el objeto si la velocidad es mayor a 1 para evitar choque falso
	short corrimientoX = 0;
	short corrimientoY = 0;
	if (v1fx >= 1 || v1fx <= -1) corrimientoX = ((v1fx/std::abs(v1fx))*5);
	if (v1fy >= 1 || v1fy <= -1) corrimientoY = ((v1fy/std::abs(v1fy))*5);
	this->figura->definirCero(this->figura->getX()+corrimientoX,this->figura->getY()+corrimientoY*3);
	this->tiempo = 0;
	
	delete(otro->velocidad);
	otro->velocidad = new Velocidad(v2fx,v2fy);
	//Corre la el objeto si la velocidad es mayor a 1 para evitar choque falso
	corrimientoX = 0;
	corrimientoY = 0;
	if (v2fx > 1 || v2fx < -1) corrimientoX = ((v2fx/std::abs(v2fx))*5);
	if (v2fy > 1 || v2fy < -1) corrimientoY = ((v2fy/std::abs(v2fy))*5);
	otro->figura->definirCero(otro->figura->getX()+corrimientoX,otro->figura->getY()+corrimientoY);
	otro->tiempo = 0;
}

void ObjetoDinamico::colisionarCon(ObjetoEstatico *otro) {
		
	short posX = otro->getFigura()->getXCercanoA(figura->getX());
	short posY = otro->getFigura()->getYCercanoA(figura->getY());
	float v1fx = getVelocidadInstX() /1.5;
	float v1fy = getVelocidadInstY() /2.5;
		
	if      ((posX == figura->getX()) || (std::abs(posX - figura->getX()) <std::abs(posY - figura->getY()))) {
		v1fy = -v1fy;
		short corrimientoY = 0;
		if (v1fy > 1 || v1fy < -1) corrimientoY = ((v1fy/std::abs(v1fy))*5);
		this->figura->definirCero(this->figura->getX(),this->figura->getY()+corrimientoY);
	} 
	else if ((posY == figura->getY()) || (std::abs(posX - figura->getX()) >std::abs(posY - figura->getY()))) {
		v1fx = -v1fx;
		
		short corrimientoX = 0;
		if (v1fx > 1 || v1fx < -1) corrimientoX = ((v1fx/std::abs(v1fx))*5);
		this->figura->definirCero(this->figura->getX()+corrimientoX,this->figura->getY());
	}
	
	delete(this->velocidad);
	this->velocidad = new Velocidad(v1fx,v1fy);
	this->tiempo = 0;
}

bool ObjetoDinamico::colisionaCon(Fondo *f) { 
	/* No hacer nada */ 
	return false;
}

bool ObjetoDinamico::colisionaCon(Reloj *f) { 
	/* No hacer nada */ 
	return false;
}
